home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / diskutil / noahdi.zoo / noahdi / hd_inst.c < prev    next >
C/C++ Source or Header  |  1992-05-24  |  24KB  |  626 lines

  1. /*
  2.     File: HD_INST.C       Harddisk Driver Installer. AHDI Compatible.
  3. */
  4. /*
  5. Copyright (c) 1988 - 1991 by Ted Schipper.
  6.  
  7. Permission to use, copy, modify, and distribute this software and its
  8. documentation for any purpose and without fee is hereby granted,
  9. provided that the above copyright notice appear in all copies and that
  10. both that copyright notice and this permission notice appear in
  11. supporting documentation.
  12.  
  13. This software is provided AS IS with no warranties of any kind.  The author
  14. shall have no liability with respect to the infringement of copyrights,
  15. trade secrets or any patents by this file or any part thereof.  In no
  16. event will the author be liable for any lost revenue or profits or
  17. other special, indirect and consequential damages.
  18. */
  19.  
  20. #include "bootsec.h"
  21. #include "hddriver.h"
  22. #include "system.h"
  23. #include <osbind.h>
  24. #include <bios.h>
  25.  
  26.  
  27. /***************************************************************************
  28.  
  29.                             Installer
  30.                            -----------
  31.  HISTORY
  32. ---------
  33.  Feb 1989. THS. Started. Tested ppu, pread, getbpb. Made some corrections
  34.                 to bootsector structure (allignment). Added a dirty
  35.                 vector installer with hd debug messages.
  36.  Mar 1989. THS. Added pool_install.
  37.  Apr 1989. THS. Removed dirty vector installer. Added normal installer,
  38.                 exec_res, exec_auto stuff.
  39.  May 1989. THS. Added some extra stuff to pread. Pread now generates an
  40.                 error when a non existing drive is selected on a
  41.                 existing controller. Can be done better.
  42.  Jun 1989. THS. Runs nice (still from auto folder). Added assembly startup
  43.                 code to get it compatible Atari HD boot. Seems to work OK.
  44.                 V0.00
  45.  
  46. ***************************************************************************/
  47.  
  48. /***************************************************************************
  49.  
  50.                           Global Variables
  51.  
  52. ***************************************************************************/
  53.  
  54. extern short  puns;
  55. extern struct bpb bpbs[];
  56. extern struct hd_drv pun[];
  57. extern func   o_init;
  58. extern func   o_bpb;
  59. extern func   o_rw;
  60. extern func   o_mediach;
  61. extern short  hd_boot_flg;
  62. extern long   base_pg_addr;
  63.  
  64. /* Initialize variables to get them into the driver code */
  65.  
  66. short  clun = 0;                /* current logical unit */
  67. short  cpun = 0;                /* current physical unit */
  68. short  installed = 0;           /* number of installed partitions */
  69. long   cdbit = 0;               /* current drive bit */
  70. struct hd_boot pbuf, lbuf;      /* sector buffers */
  71.  
  72. char *copy_msg =
  73. "----------------------------\r\n\
  74.  ASCI/SCSI Hard Disk Driver\r\n\
  75.  NOAHDI V0.00 Sept-26-1989\r\n\
  76.  by T.Schipper Installed\r\n\
  77. ----------------------------\r\n";
  78.  
  79. char *env_str = "PATH=\0C:\\\0";  /* enviroment string */
  80. char *nothing = "\0";             /* empry string */
  81. char *auto_path = "C:\\AUTO\\*.PRG"; /* search string for Fsfirst */
  82. char *command = "COMMAND.PRG";    /* prg to execute if comload is true */
  83. long auto_base_pg = 0L;           /* temp storage for basepage addr */
  84.  
  85. char dta[44] = {0,0};             /* DTA buffer */
  86. char exec_path[32] = {0,0};       /* filename build string */
  87.  
  88. char   *dvr_nld =
  89. "Hard disk driver not loaded; hit RETURN\r\nkey to continue:\r\n";
  90.  
  91. char   *dsk_bsd = "*** WARNING ***\r\n\a\
  92. This hard disk driver may not work with\r\n\a\\
  93. a disk-based version of TOS; files on\r\n\a\
  94. your hard disk may be damaged.\r\n\a\r\n\a";
  95.  
  96. char   *unf_rel = "*** WARNING ***\r\n\a\
  97. You are using an unofficial ROM release\r\n\a\
  98. of the operating system. This driver\r\n\a\
  99. may not work correctly with it. Files\r\n\a\
  100. on your hard disk may be damaged.\r\n\a\r\n\a";
  101.  
  102. struct rom_rev {
  103.                 long rel_date;   /* ROM release date */
  104.                 long pool_list;  /* free list addr of release */
  105.                };
  106.  
  107. struct rom_rev revtable[4] = { 0x11201985L, 0x000056FAL,
  108.                                0x02061986L, 0x000056FAL,
  109.                                0x04241986L, 0x000056FAL,
  110.                                0x00000000L, 0x00000000L
  111.                             };
  112.  
  113. /***************************************************************************
  114.  
  115.                                Installer
  116.  
  117. ***************************************************************************/
  118.  
  119. /***************************************************************************
  120.  *
  121.  * Function name : exec_res. Execute memory resident programs.
  122.  * Parameters    : None
  123.  * Returns       : None
  124.  * Description   : Check physical memory every 512 bytes for a long magic
  125.  *                 number. If magic number found, check if next long points
  126.  *                 to magic number. If pointer to magic number is valid,
  127.  *                 calculate the checksum of the first 256 words. If the
  128.  *                 check is magic too, execute memory resident program at
  129.  *                 the address specified in the 3rd long.
  130.  * Comments      : 
  131.  */
  132.  
  133. void exec_res()
  134. {
  135.  func res_prg;
  136.  unsigned short checksum;
  137.  short *chksum_ptr, i;
  138.  long  *mem_ptr;
  139.  
  140.  mem_ptr = (long *)PHYSTOP;         /* get end of memory */
  141.  while ((mem_ptr -= 0x80) > (long *)0x0400L)
  142.  {                                  /* dec 512 bytes, untill 0x600, then */
  143.     if (*mem_ptr == 0x12123456L)    /* magic long word at 512b boundary */
  144.     {
  145.        if (*(mem_ptr + 1) == (long)mem_ptr) /* pointer to magic OK */
  146.        {
  147.           checksum = 0;             /* clear checksum */
  148.           chksum_ptr = (short *)mem_ptr; /* set pointer to first word */
  149.           for (i=0; i<256; i++)     /* calc checksum from 256 words */
  150.              checksum += *chksum_ptr++;
  151.           if (checksum == 0x5678)   /* is the checksum magic */
  152.           {
  153.              res_prg = (func)*(mem_ptr + 2); /* set pointer to entry point */
  154.              (*res_prg)();          /* execute memory resident programm */
  155.           }
  156.        }
  157.     }
  158.  }
  159. }
  160.  
  161.  
  162. /***************************************************************************
  163.  *
  164.  * Function name : exec_auto_prg. Start auto-folder execute process.
  165.  * Parameters    : None
  166.  * Returns       : None
  167.  * Description   : Create a basepage for, and start the auto-folder program
  168.  *                 which executes all the programs in the auto folder.
  169.  * Comments      : Since we can't read the micro registers, the basepage
  170.  *                 address is stored in a global variable. This variable
  171.  *                 is used by the auto-folder executer to find its basepage.
  172.  */
  173.  
  174. void exec_auto_prg()
  175. {
  176.  void auto_prg();
  177.  long *basepage;
  178.  
  179.  basepage = (long *)Pexec(5,nothing,nothing,nothing); /* create a basepage */
  180.  *(basepage + 2) = (long)auto_prg;            /* set process start address */
  181.  auto_base_pg = (long)basepage;               /* save basepage address */
  182.  Pexec(4,nothing,basepage,nothing);       /* execute auto_prg as a process */
  183. }
  184.  
  185.  
  186. /***************************************************************************
  187.  *
  188.  * Function name : auto_prg. Auto folder search and execute program.
  189.  * Parameters    : None
  190.  * Returns       : None
  191.  * Description   : Search the auto folder for programs. Execute each found
  192.  *                 program. Set SYSBASE variable. Check if command load
  193.  *                 flag is set, and execute command.prg if set. Else build
  194.  *                 a basepage and execute the AES.
  195.  * Comments      : 
  196.  */
  197.  
  198. void auto_prg()
  199. {
  200.  char *ptr_s, *ptr_d, *ptr_m;
  201.  long  *base_page;
  202.  func  reset;
  203.  
  204.  Dsetdrv(2);                    /* set the default drive to C: */
  205.  Super(auto_base_pg + 0x100L);  /* supervisor mode, stack at end of basepage */
  206.  if (Mshrink(auto_base_pg,0x100L) == 0); /* return unused memory */
  207.  {
  208.      Fsetdta(dta);              /* set disk transfer address */
  209.      if (Fsfirst(auto_path,7) == 0) /* check for auto prg's */
  210.      {
  211.         do
  212.         {
  213.            ptr_s = auto_path;
  214.            ptr_d = exec_path;
  215.            ptr_m = &auto_path[8];
  216.            while (ptr_s != ptr_m)  /* copy C:\AUTO\ to exec filename string */
  217.               *ptr_d++ = *ptr_s++;
  218.            ptr_s = &dta[30];       /* ptr to found program filename */
  219.            while(*ptr_s != 0)      /* copy filename from dta buffer */
  220.               *ptr_d+